package com.atguigu.gmall.order.listener;

import com.atguigu.gmall.util.consts.MqConst;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * @author lfy
 * @Description
 * @create 2022-10-22 10:47
 */
@Service
public class Haha {

//    @RabbitListener(queues = "haha-q")
    public void haha(Message message, Channel channel) throws IOException {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        byte[] body = message.getBody();

        //ready：队列里面存储的未发送给消费者的消息
        //unacked: 发给消息者，消费者未回复的消息。
        // 在消费端手动ack模型下，没有ack服务器宕机，消息不会丢失

        //给服务器回复ack，服务器就可以删除消息了。
        //是否批量多个回复
        // 业务成功才回复OK，否则回复失败，让服务器不删除此消息即可
        try {
            System.out.println("收到消息：正在执行业务："+new String(body));
            channel.basicAck(deliveryTag,false);
            //只有真正被处理完成的消息，才能被服务器删除。否则消息一直在不会丢失
        } catch (IOException e) {
            //连接中断。有可能会回复不了ok
        } catch (Exception e){
            //业务问题。回复失败
            channel.basicNack(deliveryTag,false,true);
        }

    }
}
